Many file systems of storage controllers can receive data through multiple channels associated with various protocols. A file system may store that data within a storage device or across multiple storage devices. Such data may have various characteristics, such as being user data (e.g., a user database file) or metadata (e.g., a volume size of a volume, a network address of a storage controller, a replication policy, and/or other data used by the file system and/or storage controller), for example. In another example, the characteristics can correspond to hot data (e.g., data that is being accessed above a threshold frequency, such as metadata that is being frequently modified by the file system) or cold data (e.g., user data that is being accessed below the threshold frequency). In another example, the characteristics can correspond to sequentially accessed data (e.g., data stored within contiguous blocks) or randomly accessed data (e.g., data stored within blocks that are not contiguous).
A virtualization layer can be used as an indirection layer that groups together physical storage from multiple storage devices into what appears to be a single storage object to clients and applications (e.g., a volume or logical unit number (LUN) may span multiple physical storage devices). The virtualization layer abstracts away the physical layout of storage, and thus operates in a logical address space that is mapped to the underlying physical address space. With virtualized storage, the storage device may assume the role of physically storing data within physical blocks of the storage device in locations chosen by the storage device. However, the storage device may store any type of data, such as hot data, cold data, user data, and metadata together without any logical/physical separation. Unfortunately, data with different characteristics may have different access and overwrite patterns, and thus fragmentation can result when such data is store together.
In an example, a solid state drive (SSD) may not have the capability to overwrite a previously written block, and can only write to empty destination cells. Thus, if a destination cell has data that is to be reused, then the data may be moved to different empty cell and the destination cell must be reprogrammed (e.g., erased) so that new data can be written to the destination cell. This results in increased fragmentation, which becomes more pronounced when data of different characteristics is stored together. The storage device can reserve space to provide for background garbage collection that can proactively free cells. However, a substantial amount of storage space may be reserved such as about 28% or any other percentage of storage of the storage device. This leads to inefficient usage of storage resources and increased cost due to over-provisioning. Also, write amplification becomes problematic on subsequent overwrites, which can lead to degraded performance and wear on the storage device.